home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / mesa-1.2.8 / samples / shape.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  6KB  |  269 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include "gltk.h"
  29.  
  30.  
  31. #define OPENGL_WIDTH 24
  32. #define OPENGL_HEIGHT 13
  33.  
  34.  
  35. GLenum rgb, doubleBuffer, directRender, windType;
  36. GLint objectIndex = 0;
  37. GLuint bases[20];
  38. float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
  39. float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
  40. float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
  41.  
  42.  
  43. static void Init(void)
  44. {
  45.  
  46.     bases[0] = glGenLists(1);
  47.     tkWireSphere(bases[0], 5.0);
  48.     bases[1] = glGenLists(1);
  49.     tkSolidSphere(bases[1], 5.0);
  50.     bases[2] = glGenLists(1);
  51.     tkWireCube(bases[2], 5.0);
  52.     bases[3] = glGenLists(1);
  53.     tkSolidCube(bases[3], 5.0);
  54.     bases[4] = glGenLists(1);
  55.     tkWireBox(bases[4], 4.0, 5.0, 6.0);
  56.     bases[5] = glGenLists(1);
  57.     tkSolidBox(bases[5], 4.0, 5.0, 6.0);
  58.     bases[6] = glGenLists(1);
  59.     tkWireTorus(bases[6], 5.0, 5.0);
  60.     bases[7] = glGenLists(1);
  61.     tkSolidTorus(bases[7], 5.0, 5.0);
  62.     bases[8] = glGenLists(1);
  63.     tkWireCylinder(bases[8], 5.0, 5.0);
  64.     bases[9] = glGenLists(1);
  65.     tkSolidCylinder(bases[9], 5.0, 5.0);
  66.     bases[10] = glGenLists(1);
  67.     tkWireCone(bases[10], 5.0, 5.0);
  68.     bases[11] = glGenLists(1);
  69.     tkSolidCone(bases[11], 5.0, 5.0);
  70.  
  71.     glClearColor(0.0, 0.0, 0.0, 0.0);
  72.     glClearIndex(0.0);
  73. }
  74.  
  75. static void Reshape(int width, int height)
  76. {
  77.  
  78.     glViewport(0, 0, (GLint)width, (GLint)height);
  79.  
  80.     glMatrixMode(GL_PROJECTION);
  81.     glLoadIdentity();
  82.     glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
  83.     glMatrixMode(GL_MODELVIEW);
  84. }
  85.  
  86. static GLenum Key(int key, GLenum mask)
  87. {
  88.  
  89.     switch (key) {
  90.       case TK_ESCAPE:
  91.         tkQuit();
  92.  
  93.       case TK_SPACE:
  94.     objectIndex++;
  95.     if (objectIndex > 11) {
  96.         objectIndex = 0;
  97.     }
  98.     break;
  99.  
  100.       case TK_LEFT:
  101.     shiftX -= 20.0;
  102.     break;
  103.       case TK_RIGHT:
  104.     shiftX += 20.0;
  105.     break;
  106.       case TK_UP:
  107.     shiftY += 20.0;
  108.     break;
  109.       case TK_DOWN:
  110.     shiftY -= 20.0;
  111.     break;
  112.       case TK_n:
  113.     shiftZ += 20.0;
  114.     break;
  115.       case TK_m:
  116.     shiftZ -= 20.0;
  117.     break;
  118.  
  119.       case TK_q:
  120.     scaleX -= 0.1;
  121.     if (scaleX < 0.1) {
  122.         scaleX = 0.1;
  123.     }
  124.     break;
  125.       case TK_w:
  126.     scaleX += 0.1;
  127.     break;
  128.       case TK_a:
  129.     scaleY -= 0.1;
  130.     if (scaleY < 0.1) {
  131.         scaleY = 0.1;
  132.     }
  133.     break;
  134.       case TK_s:
  135.     scaleY += 0.1;
  136.     break;
  137.       case TK_z:
  138.     scaleZ -= 0.1;
  139.     if (scaleZ < 0.1) {
  140.         scaleZ = 0.1;
  141.     }
  142.     break;
  143.       case TK_x:
  144.     scaleZ += 0.1;
  145.     break;
  146.  
  147.       case TK_e:
  148.     angleX -= 5.0;
  149.     if (angleX < 0.0) {
  150.         angleX = 360.0 + angleX;
  151.     }
  152.     break;
  153.       case TK_r:
  154.     angleX += 5.0;
  155.     if (angleX > 360.0) {
  156.         angleX = angleX - 360.0;
  157.     }
  158.     break;
  159.       case TK_d:
  160.     angleY -= 5.0;
  161.     if (angleY < 0.0) {
  162.         angleY = 360.0 + angleY;
  163.     }
  164.     break;
  165.       case TK_f:
  166.     angleY += 5.0;
  167.     if (angleY > 360.0) {
  168.         angleY = angleY - 360.0;
  169.     }
  170.     break;
  171.       case TK_c:
  172.     angleZ -= 5.0;
  173.     if (angleZ < 0.0) {
  174.         angleZ = 360.0 + angleZ;
  175.     }
  176.     break;
  177.       case TK_v:
  178.     angleZ += 5.0;
  179.     if (angleZ > 360.0) {
  180.         angleZ = angleZ - 360.0;
  181.     }
  182.     break;
  183.       default:
  184.     return GL_FALSE;
  185.     }
  186.     return GL_TRUE;
  187. }
  188.  
  189. static void Draw(void)
  190. {
  191.  
  192.     glClear(GL_COLOR_BUFFER_BIT);
  193.  
  194.     TK_SETCOLOR(windType, TK_WHITE);
  195.  
  196.     glPushMatrix();
  197.  
  198.     glTranslatef(shiftX, shiftY, shiftZ);
  199.     glRotatef(angleX, 1.0, 0.0, 0.0);
  200.     glRotatef(angleY, 0.0, 1.0, 0.0);
  201.     glRotatef(angleZ, 0.0, 0.0, 1.0);
  202.     glScalef(scaleX, scaleY, scaleZ);
  203.  
  204.     glCallList(bases[objectIndex]);
  205.     glPopMatrix();
  206.  
  207.     glFlush();
  208.  
  209.     if (doubleBuffer) {
  210.     tkSwapBuffers();
  211.     }
  212. }
  213.  
  214. static GLenum Args(int argc, char **argv)
  215. {
  216.     GLint i;
  217.  
  218.     rgb = GL_TRUE;
  219.     doubleBuffer = GL_FALSE;
  220.     directRender = GL_TRUE;
  221.  
  222.     for (i = 1; i < argc; i++) {
  223.     if (strcmp(argv[i], "-ci") == 0) {
  224.         rgb = GL_FALSE;
  225.     } else if (strcmp(argv[i], "-rgb") == 0) {
  226.         rgb = GL_TRUE;
  227.     } else if (strcmp(argv[i], "-sb") == 0) {
  228.         doubleBuffer = GL_FALSE;
  229.     } else if (strcmp(argv[i], "-db") == 0) {
  230.         doubleBuffer = GL_TRUE;
  231.     } else if (strcmp(argv[i], "-dr") == 0) {
  232.         directRender = GL_TRUE;
  233.     } else if (strcmp(argv[i], "-ir") == 0) {
  234.         directRender = GL_FALSE;
  235.     } else {
  236.         printf("%s (Bad option).\n", argv[i]);
  237.         return GL_FALSE;
  238.     }
  239.     }
  240.     return GL_TRUE;
  241. }
  242.  
  243. void main(int argc, char **argv)
  244. {
  245.  
  246.     if (Args(argc, argv) == GL_FALSE) {
  247.     tkQuit();
  248.     }
  249.  
  250.     tkInitPosition(0, 0, 400, 400);
  251.  
  252.     windType = (rgb) ? TK_RGB : TK_INDEX;
  253.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  254.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  255.     tkInitDisplayMode(windType);
  256.  
  257.     if (tkInitWindow("Font Test") == GL_FALSE) {
  258.     tkQuit();
  259.     }
  260.  
  261.     Init();
  262.  
  263.     tkExposeFunc(Reshape);
  264.     tkReshapeFunc(Reshape);
  265.     tkKeyDownFunc(Key);
  266.     tkDisplayFunc(Draw);
  267.     tkExec();
  268. }
  269.